package com.stedu.mall.goodsservice.service;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.stedu.mall.common.bean.Category;
import com.stedu.mall.common.exception.SteduException;
import com.stedu.mall.common.service.CategoryService;
import com.stedu.mall.goodsservice.mapper.CategoryMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class CategoryServicelmpl implements CategoryService {
    @Autowired
    private CategoryMapper categoryMapper;
    @Override
    public boolean insert(Category category) throws SteduException {
        if (category.getParentId()!=0){
            //判断被添加的的分类对应的父分类是否存在
            Category parent=categoryMapper.selectById(category.getParentId());
            if(parent==null || (parent!=null&&parent.getParentId()!=0)){

                throw new SteduException("被添加分类的父分类不存在或不合法，无法添加");
            }
        }

        List<Category> categoryList = categoryMapper.selectByParentId(category.getParentId());
        boolean fiag = categoryList.stream()
                .anyMatch(item -> item.getName().equals(category.getName()));
        if(fiag){
            throw  new SteduException("被添加分类的名字和其他分类的名字相同，不允许添加");
        }
        //判断同一个父类下是否又同名的子分类
        return categoryMapper.insert(category) == 1;
    }

    @Override
    public boolean delete(Integer id) throws SteduException {
       Category category = categoryMapper.selectById(id);
        if(category == null){
            throw new SteduException("该分类不存在无法删除");
        }
        if(category.getParentId()==0&&category.getChildList().size()>0){
            throw new SteduException("该分类存在关联的子分类，无法删除");
        }

        //TODO 是子分类判断下面是否有商品

        return categoryMapper.delete(id)==1;
    }

    @Override
    public boolean update(Category category) throws SteduException {
        //查询修改之前的信息
        Category oldInfo = categoryMapper.selectById(category.getId());
        Category newInfo = category;
        //判断被修改的分类是否存在
        if(oldInfo == null){
            throw new SteduException("该类不存在无法修改");
        }
        //判断该分类是一个父亲分类，并且其下存在子分类，那么这个父分类不能修改为子分类
        if(oldInfo.getParentId() == 0 && oldInfo.getChildList().size()>0 &&(newInfo.getParentId()!=null && newInfo.getParentId() != 0)){
            throw new SteduException("该类存在子分类，无法修改为子分类---");
        }
        //一个父分类不能把自己设置为自己父分类
        if(oldInfo.getParentId()==0 && newInfo.getParentId() != 0 && newInfo.getParentId() == oldInfo.getId()){
            throw new SteduException("无法设置当前分类为自己的父分类，无法修改");
        }
        //判断一个父分类下是否有同名的子分类--重名
       Integer parentId = newInfo.getParentId()==null? oldInfo.getParentId():newInfo.getParentId();
        String name = newInfo.getName()==null ? oldInfo.getName():newInfo.getName();

        if (categoryMapper.selectByParentId(parentId)
                .stream()
                .anyMatch(item-> item.getName().equals(name)&&item.getId() != category.getId())) {
            throw new SteduException("修改之后的分类名与同级的分类名相同不允许修改");
        }
        return categoryMapper.update(category)==1;
    }

    @Override
    public Object selectByCondtion(Category condition, Integer pageNum, Integer pageSize) {
       if(pageNum == null){
           //不分页
           return  categoryMapper.selectByCondtion(condition);
       }else {
           //分页
           //设置分页参数
           PageHelper.startPage(pageNum, pageSize);
           List<Category> categories=categoryMapper.selectByCondtion(condition);
           PageInfo<Category> pageInfo=new PageInfo<>(categories);
           return pageInfo;
       }

    }

    @Override
    public Category selectById(Integer id) {
        return categoryMapper.selectById(id);
    }
}
